package mr.ali.video.web.Exception;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @author Mr-ali
 */
@Data
@Accessors(chain = true)
public class R<Object> implements Serializable {
   /**
    * 服务器成功返回用户请求的数据
    */

   public static final int ok = 200;

   /**
    * 用户新建和修改数据成功
    */
   public static final int CREATED = 201;

   /**
    * 表示一个请求已经进入后台排队（异步任务）
    */
   public static final int ACCEPTED = 202;

   /**
    * 用户删除数据成功
    */
   public static final int NO_CONTENT = 204;

   /**
    * 用户发出的请求有错误，服务器没有新建或修改数据的操作
    */
   public static final int INVALID_REQUEST = 400;
   /**
    * 表示没有权限（令牌，密码，用户名错误）
    */
   public static final int UNAUTHORIZED = 401;
   /**
    * 表示用户得到授权（与401错误相对）但是访问被禁止的
    */
   public static final int FORBIDDEN = 403;
   /**
    * 用户发出的请求不存在的记录
    */
   public static final int NOT_FOUND = 404;
   /**
    * 用户请求的资源被永久的删除，且在不会得到的
    */
   public static final int GONE = 410;
   /**
    * 当创建一个对象时，发生一个验证错误
    */
   public static final int UNPROCESABLE_ENTITY = 422;
   /**
    * 服务器发生错误、用户无法判断发出的请求是否成功
    */
   public static final int INTERNAL_SERVER_ERROR = 500;

   private int code;
   private String message;
   private Object data;

   public static R ok(String message) {
      return new R() .setCode(ok).setMessage(message);
   }

   public static R ok(java.lang.Object data) {
      return new R().setCode(ok).setData(data);
   }

   public static R created(String message) {
      return new R().setCode(CREATED).setMessage(message);
   }

   public static R ACCEPTED(String message) {
      return new R().setCode(ACCEPTED).setMessage(message);
   }

   public static R NO_CONTENT(String message) {
      return new R().setCode(NO_CONTENT).setMessage(message);
   }

   public static R INVALID_REQUEST(String message) {
      return new R().setCode(INVALID_REQUEST).setMessage(message);
   }

   public static R UNAUTHORIZED(String message) {
      return new R().setCode(UNAUTHORIZED).setMessage(message);
   }

   public static R FORBIDDEN(String message) {
      return new R().setCode(FORBIDDEN).setMessage("权限不足！");
   }

   public static R NOT_FOUND(String message) {
      return new R().setCode(NOT_FOUND).setMessage(message);
   }

   public static R GONE(String message) {
      return new R().setCode(GONE).setMessage(message);
   }

   public static R UNPROCESABLE_ENTITY(String message) {
      return new R().setCode(UNPROCESABLE_ENTITY).setMessage(message);
   }

   public static R INTERNAL_SERVER_ERROR(String message) {
      return new R().setCode(INTERNAL_SERVER_ERROR).setMessage(message);
   }

   public static R failed(ServiceException e) {
      return new R().setCode(e.getCode()).setMessage(e.getMessage());
   }

   public static R failed(Exception e) {
      return new R().setCode(e.hashCode()).setMessage(e.getMessage());
   }
}
